package com.algorithm.ch1.cjm.string;

/**
 * 颠倒整数
 * 给定一个 32 位有符号整数，将整数中的数字进行反转。
 * <p>
 * 示例 1:
 * 输入: 123
 * 输出: 321
 * <p>
 * 示例 2:
 * 输入: -123
 * 输出: -321
 * <p>
 * 示例 3:
 * 输入: 120
 * 输出: 21
 * <p>
 * 注意:
 * 假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−2^31,  2^31 − 1]。根据这个假设，如果反转后的整数溢出，则返回 0
 */
public class Reverse {

    public static void main(String[] args) {

        int in = -147483647;
        int reverse = reverse(in);
//        System.out.println(reverse);

        boolean b = true || false && false;

        System.out.println(b);


//        System.out.println(pow);//2147483647

//        System.out.println(min);//-2147483648

    }


    /**
     * 换成为字符串，再用字符串反转，
     * 转换成long 类型判断int 类型的溢出问题
     *
     * @param x
     * @return
     */
    public static int reverse(int x) {

        if (x == Integer.MIN_VALUE) {
            return 0;
        }

        int gg = Math.abs(x);

        String str = gg + "";

        char[] chars = str.toCharArray();

        //数组长度
        int length = chars.length;

        for (int i = 0; i < chars.length / 2; i++) {

            char temp = chars[i];
            chars[i] = chars[length - 1 - i];
            chars[length - 1 - i] = temp;
        }

        String str1 = new String(chars);

        long longStr = Long.valueOf(str1);

        if (x > 0) {

            if (longStr > Integer.MAX_VALUE) {
                return 0;
            } else {
                return Integer.valueOf(str1);
            }
        } else {

            if (-longStr < Integer.MIN_VALUE) {
                return 0;
            } else {
                return -Integer.valueOf(str1);
            }
        }
    }

    /**
     *  利用计算
      * @param x
     * @return
     */
    public static int reverse1(int x){

        int res  = 0;
        int pop = 0;
        int next = x;

        do{

            pop = next%10;
            next = next/10;


            //-2147483648
            if(res < Integer.MIN_VALUE/10 || res == Integer.MIN_VALUE/10 && pop < Integer.MIN_VALUE%10){
                return 0;
            }else if(res > Integer.MAX_VALUE/10 || res == Integer.MAX_VALUE/10 && pop > Integer.MAX_VALUE%10){//2147483647
                return 0;
            }

            res = res * 10 + pop;

        }while (next != 0);

        return res;
    }


}
